package com.jiuli_travel.websocket;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.util.concurrent.CopyOnWriteArraySet;
import java.util.Set;

@Component
public class MessageWebSocketHandler extends TextWebSocketHandler {

    private static final Set<WebSocketSession> sessions = new CopyOnWriteArraySet<>();

    /**
     * 当一个新的WebSocket连接建立时，将该会话添加到已连接会话集合中。
     * @param session 新建立的WebSocketSession对象
     * @throws Exception 如果处理连接建立时发生异常
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
    }

    /**
     * 处理从客户端接收到的文本消息。
     * 在此示例中，我们仅演示服务器推送消息，因此该方法留空。
     * 若要处理客户端发送的消息，可以在此方法中添加相应逻辑。
     * @param session 发送消息的WebSocketSession对象
     * @param message 从客户端接收到的TextMessage对象
     * @throws Exception 如果处理消息时发生异常
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 这里可以处理客户端发送的消息，本示例仅演示服务器推送，故此处留空
    }

    /**
     * 当一个WebSocket连接关闭时，从已连接会话集合中移除该会话。
     * @param session 已关闭的WebSocketSession对象
     * @param status 关闭状态
     * @throws Exception 如果处理连接关闭时发生异常
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    /**
     * 广播消息到所有已连接的WebSocket客户端。
     * @param message 要推送的字符串消息
     */
    public void broadcastMessage(String message) {
        for (WebSocketSession webSocketSession : sessions) {
            try {
                webSocketSession.sendMessage(new TextMessage(message)); // 向每个会话发送消息
            } catch (Exception e) {
                // Handle exception
            }
        }
    }
}